#include "cards.h"
// #include "loading.h"
#include "login.h"
#include "aescrypto.h"
#include "rsacrypto.h"
#include <QApplication>
#include <QDebug>
#include <QDateTime>
#include <QFile>


void testBase64()
{
    // 现在base64EncodedData包含了Base64编码后的文本字符串

    AesCrypto aes(AesCrypto::AES_CBC_128, "1234567887654321");
    QByteArray text = aes.encrypt("人生若只如初见，何事秋风悲画扇。等闲变却故人心，却道故心人易变。骊山语罢清宵半，泪雨霖铃终不怨。何如薄幸锦衣郎，比翼连枝当日愿。");
    qDebug() << "加密之后的密文:" << text.data();
    text= aes.decrypt(text);
    qDebug() << "解密之后的明文:" << text.data();
}


// 测试AES加密解密
void test()
{
    AesCrypto aes(AesCrypto::AES_CBC_128, "1234567887654321");
    QByteArray text = aes.encrypt("人生若只如初见，何事秋风悲画扇。等闲变却故人心，却道故心人易变。骊山语罢清宵半，泪雨霖铃终不怨。何如薄幸锦衣郎，比翼连枝当日愿。");
    qDebug() << "加密之后的密文:" << text.data();
    text= aes.decrypt(text);
    qDebug() << "解密之后的明文:" << text.data();

    RsaCrypto rsa;
    rsa.generateRsaKey(RsaCrypto::BITS_2K);

    RsaCrypto rsa1("public.pem", RsaCrypto::PublicKey);
    // 推荐标准: 可加密的最大数据长度 = bits / 8 - 11; 11是填充的
    // QByteArray temp = "一生一代一双人，争教两处销魂。";
    QByteArray temp = "人生若只如初见，何事秋风悲画扇。";

    qDebug() << "加密之前的数据:" <<  temp.data();
    temp = rsa1.pubKeyEncrypt(temp);
    qDebug() << "公钥加密的密文:" << temp;

    RsaCrypto rsa2("private.pem", RsaCrypto::PrivateKey);
    temp = rsa2.privateKeyDecrypt(temp);
    qDebug() << "解密之后的数据:" <<  temp.data();

    temp = rsa2.sign(text);
    qDebug() << "私钥签名的密文:" << temp;

    bool flag = rsa1.verify(temp, text);
    qDebug() << "flag = " << flag;
}


QByteArray generateAesKeyTest02(int keylength)
{
    // 为了保证密钥的随机性，可以通过获取当前的系统时间来生成密钥
    QByteArray time = QDateTime::currentDateTime().toString("yyyy.MM.dd-hh:mm:ss.zzz").toUtf8();
    // 进行哈希计算
    QCryptographicHash hash(QCryptographicHash::Sha3_384);
    hash.addData(time);
    time = hash.result();
    // 选取keylength长度作为密钥
    time = time.left(keylength);

    return time;
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<Cards>("Cards&");
    qRegisterMetaType<Cards>("Cards");

    // 加载资源文件
    QFile file(":/conf/style.qss");
    bool flag = file.open(QFile::ReadOnly);
    if (!flag) {
        assert(flag);
    }
    QByteArray all = file.readAll();
    a.setStyleSheet(all);
    file.close();

    // Loading w;
    Login w;
    // testBase64();
    // testString();
    int ret = w.exec();
    if (ret == QDialog::Accepted) {
        // test();
        return a.exec();
    }

}
